import 'dart:developer' as dev;
import 'package:flutter/material.dart';
import 'package:ideology/features/screens/widgets/editor_area/code_editor_business.dart';
import 'package:ideology/shared/widgets/file_explorer/file_node.dart';

/// 资源管理器动作的统一处理器。
///
/// 用于把 **业务逻辑** 与 **UI 展示** 解耦：
/// - 在这里集中处理打开文件、错误捕获与提示；
/// - 上层组件只需要调用，不需要关心 try/catch 和 SnackBar。
///
/// 特点：
/// - 所有操作均包裹 try/catch，避免异常泄漏到 UI；
/// - 错误会写入日志，并在 UI 上通过 [SnackBar] 提示；
/// - 通过 [mounted] 确保在组件已卸载时不会再操作 UI。
class ExplorerActionHandler {
  ExplorerActionHandler({
    required this.useCases,
    required this.messenger,
    required this.mounted,
  });

  /// 编辑器的业务用例集合。
  ///
  /// 由外部注入，用来真正执行打开文件等逻辑。
  final CodeEditorUseCases useCases;

  /// 用于展示 SnackBar 的 [ScaffoldMessengerState]。
  final ScaffoldMessengerState messenger;

  /// 用来检查当前组件是否仍然挂载。
  ///
  /// 通常传入 `() => context.mounted`。
  final bool Function() mounted;

  /// 打开一个 [FileNode]。
  ///
  /// - [path] 文件路径；
  /// - [node] 文件树节点。
  ///
  /// 成功时调用 [CodeEditorUseCases.openNode]；
  /// 失败时写日志并弹出错误提示。
  Future<void> openNode(String path, FileNode node) async {
    try {
      await useCases.openNode(path, node);
    } catch (e, st) {
      // 捕获并记录错误
      dev.log('openNode failed', error: e, stackTrace: st);

      // 确保组件还挂载才展示 UI
      if (!mounted()) return;

      messenger.showSnackBar(
        SnackBar(content: Text('打开文件失败: $e')),
      );
    }
  }
}
